
// // ����һ���Ӹ� ���ඨ�����飬������Զ���Ĵ���
//template<typename T, int i> class S1;
//template<typename T, int i, template<typename, int> class SP>
//struct S {};
//template<int i, template<typename, int> class SP>
//struct S<char, i, SP> {};//�������ֻ�����������壨��û�д�����{}������ objComp1���Զ��壬������ objcttt����������ʧ�ܡ��������������Щ�����ڱ�����ʾ

//template<typename T, int i> class S1;
//template<typename T, int i, template<typename, int> class SP>
//struct S {};
//template<int i, template<typename, int> class SP>
//class S<char, i, SP> {};//S�ػ��� ͨ�ð�ֱ��� class ��struct �����¡������������������objComp1����objcttt����

//template<typename T, int i> class S1;
//template<typename T, int i, template<typename, int> typename SP>// SPǰ��� class���� typename Ҳ����������objComp1����objcttt����������﷨����Ŀǰ��û��Ȩ����ϸ��˵��
//class S {};
//template<int i, template<typename, int> class SP>
//class S<char, i, SP> {};

template<typename T, int i> class S1;
template<typename T, int i, template<typename, int> class SP>
class S;
//����1����ƥ��S<char, ����������SP����>
template<int i, template<typename, int> class SP>
class S<char, i, SP>;
//����2����ƥ��S<������const���ε�����, ����������SP����>
template<typename T, int i, template<typename, int> class SP>
class S<const T, i, SP>;
//����3����ȫ�ػ���ֻ��ƥ��S<char, 10, S1>
template<>
class S<char, 10, S1>;
//template<>
//class STTT<char, 10, S1>;// error C3856: ��STTT��: ���Ų��� ģ�� ��
//����4����ģ��ʵ����Ϊ���Ͳ�����ֵ��ƥ��S<S1<��������, 10>, 10, S1>
template<typename T>
class S<S1<T, 10>, 10, S1>;
//����5������ƥ����Ŀ����ͨ������������һ��
//template<typename T, int i, template<typename, int> class SP, typename TT>
//class S<T, i, SP, TT>;//error C2977: ��S��: ģ�� ����̫��
//template<typename T, int i, template<typename, int> class SP, typename TT>
//class S<T, i, SP>;//error C2753: ��S<T,i,SP>��: ����ר�û��޷�����ģ��Ĳ����б�ƥ�� //error C2764: ��TT��: ����ר�û���S<T,i,SP>����δʹ�û����Ƶ�����ģ�����
//template<typename T, int i, template<typename, int> class SP, typename TT> //�����һ������ͷ�ж�����������������������ģ�����ƥ�����������֣�û�뵽�ŷ���
//class S<typename T::TT, i, SP>;// error C2764: ��T��: ����ר�û���S<T::TT,i,SP>����δʹ�û����Ƶ�����ģ����� //error C2764: ��TT��: ����ר�û���S<T::TT,i,SP>����δʹ�û����Ƶ�����ģ�����
//����6������ƥ��ʽ��Ŀ������ͨ���������Ͳ�ͬ
template<typename T, int i, template<typename, int> class SP>
class S;
template<typename T, int i, template<typename, int> class SP>
class SS;
//template<typename T>
//class S<char, 10, T>;// error C3200: ��T��: ģ�������SP����ģ�������Ч��Ӧ������ģ�� //error C2976: ��S'��: ģ�� ����̫��
//����7������ģ���Ͳ���SP��ͨ�������Ͳ�һ��
//template<typename T, int i, template<typename> class SP>
//class S<const T, i, SP>;// error C3201: ��ģ�塰SP����ģ������б���ģ�������SP����ģ������б���ƥ�� //error C3855: ��S��: ģ�� ������SP��������������

//�Ƿ���˵�����ػ����templateͷ�е���������������ͨ�ð汾�в���Ҫ�й����ԣ�
//
// ժ¼ch4.2����ƥ��ʽΪ���Ľ���������д��
// ƥ��ʽд��ģ������֮���ü��������𡣡�ƥ��ʽ�Ķ��塿
// ƥ��ʽ���ö��ŷָ�����Ŀ�б�����Ŀ��������ͨ��ģ���������һ�¡�����Ŀ�б�����Ŀ����ͨ��ģ�塢ģ�������
// ƥ��ʽ�и���Ŀ���ͱ�����ͨ����Ӧģ���������һ�¡���������ƥ��ʽ����Ŀ���ͣ���ô��ģ������Ķ�Ӧ���ˣ�������
// ƥ��ʽ��Ŀ�����Ǿ����ģ�����ֵ��Ҳ�����������Լ�������ģ���������������Ȼ������������һ���������ġ�һ�¡�һ˵������
// ��ƥ��ʽ��Ŀ������ģ�����ʱ���뺯���������ƣ�ģ�����Ҳ������*��&��const��volatile���Ρ�
//
int run_main_eg4_3()
{
    //S<int, 9, S1> objComp1;
    //S<char, 9, S1> objcttt;
    return 0;
}

int main() {
    return run_main_eg4_3();
}
